[404218]: / Code / All Qiskit, PennyLane QML Nov 23 / 10a6 Eff. Dimension .955Local kkawchak.ipynb

Download this file

1053 lines (1052 with data), 165.9 kB

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Effective Dimension of Qiskit Neural Networks\n",
    "In this tutorial, we will take advantage of the `EffectiveDimension` and `LocalEffectiveDimension` classes to evaluate the power of Quantum Neural Network models. These are metrics based on information geometry that connect to notions such as trainability, expressibility or ability to generalize.\n",
    "\n",
    "Before diving into the code example, we will briefly explain what is the difference between these two metrics, and why are they relevant to the study of Quantum Neural Networks. More information about global effective dimension can be found in [this paper](https://arxiv.org/pdf/2011.00027.pdf), while the local effective dimension was introduced in a [later work](https://arxiv.org/abs/2112.04807)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 1. Global vs. Local Effective Dimension\n",
    "Both classical and quantum machine learning models share a common goal: being good at **generalizing**, i.e. learning insights from data and applying them on unseen data.\n",
    "\n",
    "Finding a good metric to assess this ability is a non-trivial matter. In [The Power of Quantum Neural Networks](https://arxiv.org/pdf/2011.00027.pdf), the authors introduce the **global** effective dimension as a useful indicator of how well a particular model will be able to perform on new data. In [Effective Dimension of Machine Learning Models](https://arxiv.org/pdf/2112.04807.pdf), the **local** effective dimension is proposed as a new capacity measure that bounds the generalization error of machine learning models.\n",
    "\n",
    "The key difference between global (`EffectiveDimension` class) and **local** effective dimension (`LocalEffectiveDimension` class) is actually not in the way they are computed, but in the nature of the parameter space that is analyzed. The global effective dimension incorporates the **full parameter space** of the model, and is calculated from a **large number of parameter (weight) sets**. On the other hand, the local effective dimension focuses on how well the **trained** model can generalize to new data, and how **expressive** it can be. Therefore, the local effective dimension is calculated from **a single** set of weight samples (training result). This difference is small in terms of practical implementation, but quite relevant at a conceptual level."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. The Effective Dimension Algorithm\n",
    "\n",
    "Both the global and local effective dimension algorithms use the Fisher Information matrix to provide a measure of complexity. The details on how this matrix is calculated are provided in the [reference paper](https://arxiv.org/pdf/2011.00027.pdf), but in general terms, this matrix captures how sensitive a neural network's output is to changes in the network's parameter space.\n",
    "\n",
    "In particular, this algorithm follows 4 main steps:\n",
    "\n",
    "1. **Monte Carlo simulation:** the forward and backward passes (gradients) of the neural network are computed for each pair of input and weight samples.\n",
    "2. **Fisher Matrix Computation:** these outputs and gradients are used to compute the Fisher Information Matrix.\n",
    "3. **Fisher Matrix Normalization:** averaging over all input samples and dividing by the matrix trace\n",
    "4. **Effective Dimension Calculation:** according to the formula from [*Abbas et al.*](https://arxiv.org/pdf/2011.00027.pdf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## 3. Basic Example (SamplerQNN)\n",
    "\n",
    "This example shows how to set up a QNN model problem and run the global effective dimension algorithm. Both Qiskit `SamplerQNN` (shown in this example) and `EstimatorQNN` (shown in a later example) can be used with the `EffectiveDimension` class.\n",
    "\n",
    "We start off from the required imports and a fixed seed for the random number generator for reproducibility purposes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_1391/2968235742.py:6: DeprecationWarning: ``qiskit.algorithms`` has been migrated to an independent package: https://github.com/qiskit-community/qiskit-algorithms. The ``qiskit.algorithms`` import path is deprecated as of qiskit-terra 0.25.0 and will be removed no earlier than 3 months after the release date. Please run ``pip install qiskit_algorithms`` and use ``import qiskit_algorithms`` instead.\n",
      "  from qiskit.algorithms.optimizers import COBYLA\n"
     ]
    }
   ],
   "source": [
    "# Necessary imports\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from IPython.display import clear_output\n",
    "from qiskit import QuantumCircuit\n",
    "from qiskit.algorithms.optimizers import COBYLA\n",
    "from qiskit.circuit.library import ZFeatureMap, RealAmplitudes, ZZFeatureMap\n",
    "from qiskit.utils import algorithm_globals\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier\n",
    "from qiskit_machine_learning.neural_networks import EffectiveDimension, LocalEffectiveDimension\n",
    "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
    "\n",
    "# set random seed\n",
    "algorithm_globals.random_seed = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "### 3.1 Define QNN\n",
    "\n",
    "The first step to create a `SamplerQNN` is to define a parametrized feature map and ansatz. In this toy example, we will use 3 qubits, and we will define the circuit used in the `SamplerQNN` class."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 621.941x284.278 with 1 Axes>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_qubits = 3\n",
    "# create a feature map\n",
    "feature_map = ZZFeatureMap(feature_dimension=num_qubits, reps=1)\n",
    "# create a variational circuit\n",
    "ansatz = RealAmplitudes(num_qubits, reps=1)\n",
    "\n",
    "# combine feature map and ansatz into a single circuit\n",
    "qc = QuantumCircuit(num_qubits)\n",
    "qc.append(feature_map, range(num_qubits))\n",
    "qc.append(ansatz, range(num_qubits))\n",
    "qc.decompose().draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The parametrized circuit can then be sent together with an optional interpret map (parity in this case) to the `SamplerQNN` constructor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# parity maps bitstrings to 0 or 1\n",
    "def parity(x):\n",
    "    return \"{:b}\".format(x).count(\"1\") % 2\n",
    "\n",
    "\n",
    "output_shape = 2  # corresponds to the number of classes, possible outcomes of the (parity) mapping."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct QNN\n",
    "qnn = SamplerQNN(\n",
    "    circuit=qc,\n",
    "    input_params=feature_map.parameters,\n",
    "    weight_params=ansatz.parameters,\n",
    "    interpret=parity,\n",
    "    output_shape=output_shape,\n",
    "    sparse=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 Set up Effective Dimension calculation\n",
    "\n",
    "In order to compute the effective dimension of our QNN using the `EffectiveDimension` class, we need a series of sets of input samples and weights, as well as the total number of data samples available in a dataset. The `input_samples` and `weight_samples` are set in the class constructor, while the number of data samples is given during the call to the effective dimension computation, to be able to test and compare how this measure changes with different dataset sizes."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can define the number of input samples and weight samples and the class will randomly sample a corresponding array from a normal (for `input_samples`) or a uniform (for `weight_samples`) distribution. Instead of passing a number of samples we can pass an array, sampled manually."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can set the total number of input samples and weight samples for random selection\n",
    "num_input_samples = 10\n",
    "num_weight_samples = 10\n",
    "\n",
    "global_ed = EffectiveDimension(\n",
    "    qnn=qnn, weight_samples=num_weight_samples, input_samples=num_input_samples\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we want to test a specific set of input samples and weight samples, we can provide it directly to the `EffectiveDimension` class as shown in the following snippet:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# we can also provide user-defined samples and parameters\n",
    "input_samples = algorithm_globals.random.normal(0, 1, size=(10, qnn.num_inputs))\n",
    "weight_samples = algorithm_globals.random.uniform(0, 1, size=(10, qnn.num_weights))\n",
    "\n",
    "global_ed = EffectiveDimension(qnn=qnn, weight_samples=weight_samples, input_samples=input_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension algorithm also requires a dataset size. In this example, we will define an array of sizes to later see how this input affects the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# finally, we will define ranges to test different numbers of data, n\n",
    "n = [5000, 8000, 10000, 40000, 60000, 100000, 150000, 200000, 500000, 1000000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 Compute Global Effective Dimension\n",
    "Let's now calculate the effective dimension of our network for the previously defined set of input samples, weights, and a dataset size of 5000."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_0 = global_ed.get_effective_dimension(dataset_size=n[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The effective dimension values will range between 0 and `d`, where `d` represents the dimension of the model, and it's practically obtained from the number of weights of the QNN. By dividing the result by `d`, we can obtain the normalized effective dimension, which correlates directly with the capacity of the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data size: 5000, global effective dimension: 5.2939\n",
      "Number of weights: 6, normalized effective dimension: 0.8823\n"
     ]
    }
   ],
   "source": [
    "d = qnn.num_weights\n",
    "\n",
    "print(\"Data size: {}, global effective dimension: {:.4f}\".format(n[0], global_eff_dim_0))\n",
    "print(\n",
    "    \"Number of weights: {}, normalized effective dimension: {:.4f}\".format(d, global_eff_dim_0 / d)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By calling the `EffectiveDimension` class with an array if input sizes `n`, we can monitor how the effective dimension changes with the dataset size."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "global_eff_dim_1 = global_ed.get_effective_dimension(dataset_size=n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Effective dimension: [5.29390229 5.33597126 5.35545289 5.46354885 5.49042841 5.52135717\n",
      " 5.54374079 5.55854944 5.60045031 5.62756494]\n",
      "Number of weights: 6\n"
     ]
    }
   ],
   "source": [
    "print(\"Effective dimension: {}\".format(global_eff_dim_1))\n",
    "print(\"Number of weights: {}\".format(d))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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+sEEzgEiIo3NnTsXW7duxZEjR9TamzZtivT0dLUkSJu1e/7++2/Vz2VlZYiPj1f9X1+XLl1w9uxZuLm5oXXr1movMUmPtbU1nJ2dcejQIbX2Q4cOPbZH5lHu7u4wMzPD0aNHVW137txR/ZIGyid137p1C3PnzkWfPn3g6elZqder4ik1hUKhart16xaSkpIQGRmJ559/Hu3atcOdO3c0jo3I0PLz83Hy5EnV74crV67g5MmTSElJQdu2bTF8+HAEBwcjNjYWV65cwbFjxxAdHY3t27cDKH8oo0uXLnj33XeRkJCA+Ph4fPDBB3jhhRfUeoU0wQSIiDTWqVMnDB8+HN9++61a+7PPPousrCx88cUXuHz5MhYvXow///xTa9+7ePFibNq0CYmJiQgLC8OdO3fw7rvvAgDCwsJw+/ZtvP322/jnn39w+fJl7Ny5E6GhoWrJgyYmTpyIefPmYf369UhKSkJERAROnjyJ8ePHa3wMS0tLvPfee5g4cSL27NmDf//9FyNHjlQb+mvevDnMzc2xcOFCJCcn4/fff8esWbPUjtOiRQtIJBJs27YNWVlZyM/PR6NGjdCkSRN8//33uHTpEvbs2YPw8HBR50hkSMePH4ePjw98fHwAAOHh4fDx8cH06dMBAMuXL0dwcDA++eQTeHh4YODAgfjnn3/QvHlzAOW9zVu3boWdnR369u2LV155Be3atcO6devEB6OFeUxEVE89PAm6wpUrVwRzc3Ph0V8fS5YsEVxdXYWGDRsKwcHBwuzZsytNgn70WP369as0MbhFixbCN998o/ouAMKaNWsEX19fwdzcXGjfvr2wZ88etX0uXLggDBo0SLC1tRXkcrng6ekpTJgwQVAqldV+T1UUCoUwY8YMwcXFRTAzMxO8vLyEP//8U22bJ02CFoTyidDvvPOO0KBBA8HBwUH44osvKsWwZs0awc3NTbCwsBB69Ogh/P777wIAISEhQbXNzJkzBUdHR0EikQghISGCIAjC7t27hXbt2gkWFhZC586dhX379lWaTEpETyYRhEcG7omIiIjqOQ6BERERkdFhAkRERERGhwkQERERGR0mQERERGR0mAARERGR0WECREREREaHCRAREREZHSZAREREZHSYABEREZHRYQJERERERocJEBERERkdJkBERERkdP4fzksyO9XWIyMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(global_eff_dim_1) / d)\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized GLOBAL effective dimension\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 4. Local Effective Dimension Example\n",
    "As explained in the introduction, the local effective dimension algorithm only uses **one** set of weights, and it can be used to monitor how training affects the expressiveness of a neural network. The `LocalEffectiveDimension` class enforces this constraint to ensure that these calculations are conceptually separate, but the rest of the implementation is shared with `EffectiveDimension`.\n",
    "\n",
    "This example shows how to leverage the `LocalEffectiveDimension` class to analyze the effect of training on QNN expressiveness."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1 Define Dataset and QNN\n",
    "\n",
    "We start by creating a 3D binary classification dataset using `make_classification` function from scikit-learn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "num_inputs = 3\n",
    "num_samples = 50\n",
    "\n",
    "X, y = make_classification(\n",
    "    n_samples=num_samples,\n",
    "    n_features=num_inputs,\n",
    "    n_informative=3,\n",
    "    n_redundant=0,\n",
    "    n_clusters_per_class=1,\n",
    "    class_sep=2.0,\n",
    ")\n",
    "X = MinMaxScaler().fit_transform(X)\n",
    "y = 2 * y - 1  # labels in {-1, 1}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next step is to create a QNN, an instance of `EstimatorQNN` in our case in the same fashion we created an instance of `SamplerQNN`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "estimator_qnn = EstimatorQNN(\n",
    "    circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2 Train QNN\n",
    "\n",
    "We can now proceed to train the QNN. The training step may take some time, be patient. You can pass a callback to the classifier to observe how the training process is going on. We fix `initial_point` for reproducibility purposes as usual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# callback function that draws a live plot when the .fit() method is called\n",
    "def callback_graph(weights, obj_func_eval):\n",
    "    clear_output(wait=True)\n",
    "    objective_func_vals.append(obj_func_eval)\n",
    "    plt.title(\"Objective function value against iteration\")\n",
    "    plt.xlabel(\"Iteration\")\n",
    "    plt.ylabel(\"Objective function value\")\n",
    "    plt.plot(range(len(objective_func_vals)), objective_func_vals)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# construct classifier\n",
    "initial_point = algorithm_globals.random.random(estimator_qnn.num_weights)\n",
    "\n",
    "estimator_classifier = NeuralNetworkClassifier(\n",
    "    neural_network=estimator_qnn,\n",
    "    optimizer=COBYLA(maxiter=80, rhobeg=1.16),\n",
    "    initial_point=initial_point,\n",
    "    callback=callback_graph,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAIjCAYAAAB/OVoZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACH+ElEQVR4nOzdeXhU5dnH8d8smcm+EbJBIGFRFgUtioKgoigi7lWppYp77YsVxb3WvYJL60JflapVtLaKWquvdatFRUFUUBFF2QkgJIEQsq8zc94/JmeSIQlkkklmkvl+rivNzJkzc57MmbHc576f+7EYhmEIAAAAAACEnDXUAwAAAAAAAF4E6QAAAAAAhAmCdAAAAAAAwgRBOgAAAAAAYYIgHQAAAACAMEGQDgAAAABAmCBIBwAAAAAgTBCkAwAAAAAQJgjSAQAAAAAIEwTpANBD3XXXXbJYLCouLj7gvrm5ubr44ou7flD7WLhwoSwWi/Lz87v92CtWrND48eMVFxcni8WiVatWdfsY2iNU5ybYQnmuQ8liseiuu+4K9TAk9cxzYP53DADQhCAdAMLImjVr9Ktf/Ur9+vWT0+lUdna2ZsyYoTVr1oR6aPs1d+5cvfHGG6Eehk9DQ4POO+88lZSU6JFHHtHf/vY3DRw4MGTj+eyzz3TXXXeptLQ0ZGNAz7Nz507dddddnbrA9MQTT2jhwoVBG1NHVFdX66677tLHH38c0nEAQE9hMQzDCPUgAADS66+/rgsuuECpqam67LLLlJeXp/z8fP31r3/Vnj179PLLL+vss8/27X/XXXfp7rvv1u7du5WWlrbf166rq5PValVUVFSXjD0+Pl7nnntui2DA7XaroaFBTqezW7Nla9eu1fDhw/X000/r8ssv77bjtuWPf/yjbrzxRm3ZskW5ubl+j3X1uekuCxcu1CWXXNLq39ib1dbWym63y263B/21V65cqSOPPFLPPfdcu6otWvu+HXLIIUpLSwtpgFxcXKy+ffvqzjvvbFF14HK55HK5FB0dHZrBAUAYCv7/owAAArZp0yZdeOGFGjRokD755BP17dvX99js2bM1ceJEXXjhhVq9erUGDRoU8Os7nc5gDrfdbDabbDZbtx93165dkqTk5ORuP3agQnVuEBzhFFx21/fN5XLJ4/HI4XB0+rW66gIHAPRklLsDQBh46KGHVF1draeeesovQJektLQ0/eUvf1FVVZUefPDBFs8tLi7W+eefr8TERPXp00ezZ89WbW2t3z6tzXsuLS3Vtddeq5ycHDmdTg0ZMkQPPPCAPB6P334ej0ePPfaYDj30UEVHR6tv37465ZRTtHLlSkneOblVVVV6/vnnZbFYZLFYfMfad47saaed1uZFhnHjxumII47w2/biiy9qzJgxiomJUWpqqn7xi19o+/bt+30vL774Yh133HGSpPPOO08Wi0XHH3+8JOn444/33d73Oc2zv/n5+bJYLPrjH/+op556SoMHD5bT6dSRRx6pFStWtHj+2rVrdf7556tv376KiYnRwQcfrNtuu02St+LhxhtvlCTl5eX53iPzPWnt3GzevFnnnXeeUlNTFRsbq6OPPlpvv/223z4ff/yxLBaLXnnlFd13333q37+/oqOjdeKJJ2rjxo37fY9ee+01WSwWLVmypMVjf/nLX2SxWPT9999LklavXq2LL75YgwYNUnR0tDIzM3XppZdqz549+z2G1PZ87c58Hlvz5ptvatq0acrOzpbT6dTgwYN17733yu12t9j38ccf16BBgxQTE6OxY8fq008/bfG5qK+v1x133KExY8YoKSlJcXFxmjhxoj766KMD/o3mHOuNGzfq4osvVnJyspKSknTJJZeourra77kffPCBJkyYoOTkZMXHx+vggw/W7373O0ne83vkkUdKki655BLf52Z/pev7ft9yc3O1Zs0aLVmyxPf85n9ne97z5t+FRx991Pdd+OGHH9r1PuXn5/v+m3b33Xf7xmG+Z63NSXe5XLr33nt9x8rNzdXvfvc71dXV+e2Xm5ur0047TUuXLtXYsWMVHR2tQYMG6YUXXmjzPQKAnoBLlwAQBt566y3l5uZq4sSJrT5+7LHHKjc3t0WgJknnn3++cnNzNW/ePH3++eeaP3++9u7du99/qFZXV+u4447Tjh079Otf/1oDBgzQZ599pltvvVUFBQV69NFHfftedtllWrhwoaZOnarLL79cLpdLn376qT7//HMdccQR+tvf/qbLL79cY8eO1ZVXXilJGjx4cKvHnT59ui666CKtWLHCF4BI0tatW/X555/roYce8m277777dPvtt+v888/X5Zdfrt27d+vPf/6zjj32WH3zzTdtZsl//etfq1+/fpo7d66uueYaHXnkkcrIyGjzvdiff/zjH6qoqNCvf/1rWSwWPfjggzrnnHO0efNmX3n66tWrNXHiREVFRenKK69Ubm6uNm3apLfeekv33XefzjnnHK1fv14vvfSSHnnkEd/UhH0vxpiKioo0fvx4VVdX65prrlGfPn30/PPP64wzztBrr73mN+VBku6//35ZrVbdcMMNKisr04MPPqgZM2boiy++aPPvmjZtmuLj4/XKK6/4LmiYFi1apJEjR+qQQw6R5A0kN2/erEsuuUSZmZlas2aNnnrqKa1Zs0aff/55UKYxBPJ5bM3ChQsVHx+vOXPmKD4+Xh9++KHuuOMOlZeX+32mnnzySV199dWaOHGirrvuOuXn5+uss85SSkqK+vfv79uvvLxczzzzjC644AJdccUVqqio0F//+ldNmTJFX375pQ477LAD/k3nn3++8vLyNG/ePH399dd65plnlJ6ergceeECSt//EaaedplGjRumee+6R0+nUxo0btWzZMknS8OHDdc899+iOO+7QlVde6ftvw/jx49v9vj766KP67W9/q/j4eN9FI/O7EOh7/txzz6m2tlZXXnmlnE6nUlNT2/U+9e3bV08++aR+85vf6Oyzz9Y555wjSRo1alSb47788sv1/PPP69xzz9X111+vL774QvPmzdOPP/6of/3rX377bty4Ueeee64uu+wyzZw5U88++6wuvvhijRkzRiNHjmz3ewUAYcUAAIRUaWmpIck488wz97vfGWecYUgyysvLDcMwjDvvvNOQZJxxxhl++/3P//yPIcn49ttvfdsGDhxozJw503f/3nvvNeLi4oz169f7PfeWW24xbDabsW3bNsMwDOPDDz80JBnXXHNNi/F4PB7f7bi4OL/XNz333HOGJGPLli2GYRhGWVmZ4XQ6jeuvv95vvwcffNCwWCzG1q1bDcMwjPz8fMNmsxn33Xef337fffedYbfbW2zf10cffWRIMl599VW/7ccdd5xx3HHHtdh/5syZxsCBA333t2zZYkgy+vTpY5SUlPi2v/nmm4Yk46233vJtO/bYY42EhATf2E3N35+HHnrI731obt9zc+211xqSjE8//dS3raKiwsjLyzNyc3MNt9vt9zcOHz7cqKur8+372GOPGZKM7777rvU3p9EFF1xgpKenGy6Xy7etoKDAsFqtxj333OPbVl1d3eK5L730kiHJ+OSTT3zb9j3XhmEYkow777zzgH9zez+PbWltjL/+9a+N2NhYo7a21jAMw6irqzP69OljHHnkkUZDQ4Nvv4ULFxqS/D4XLpfL7z01DMPYu3evkZGRYVx66aV+2/f9G83v5b77nX322UafPn189x955BFDkrF79+42/64VK1YYkoznnnuuzX2aa+0cjBw5stXPfHvfc/O7kJiYaOzatctv3/a+T7t3727zs2C+X6ZVq1YZkozLL7/cb78bbrjBkGR8+OGHvm0DBw5s8TnctWtXq/+NAYCehHJ3AAixiooKSVJCQsJ+9zMfLy8v99s+a9Ysv/u//e1vJUnvvPNOm6/16quvauLEiUpJSVFxcbHvZ/LkyXK73frkk08kSf/85z9lsVh05513tniNjmRQExMTNXXqVL3yyisymvUtXbRokY4++mgNGDBAkreJnsfj0fnnn+83vszMTA0dOrTVsuOuMH36dKWkpPjum9nMzZs3S5J2796tTz75RJdeeqlv7KaOZpjfeecdjR07VhMmTPBti4+P15VXXqn8/Hz98MMPfvtfcsklfnOD9x1jW6ZPn65du3b5NRR77bXX5PF4NH36dN+2mJgY3+3a2loVFxfr6KOPliR9/fXXgf+BrWjv57EtzcdYUVGh4uJiTZw4UdXV1Vq7dq0kbxO2PXv26IorrvCbAz1jxgy/cyx553ab76nH41FJSYlcLpeOOOKIdv/NV111ld/9iRMnas+ePb7vr1kJ8uabb7arpD/YAn3Pf/7zn7eo/gjG+7Qv879bc+bM8dt+/fXXS1KLaqIRI0b4VSD17dtXBx988AE//wAQzih3B4AQM4NvM1hvS1vB/NChQ/3uDx48WFardb9rJW/YsEGrV69us+TabLy2adMmZWdnKzU1db9jC8T06dP1xhtvaPny5Ro/frw2bdqkr776yq+8dsOGDTIMo8XfZuquTuj7Bt5mMLd3715JTYGwWRoeDFu3btVRRx3VYvvw4cN9jzc/3oHG2JZTTjlFSUlJWrRokU488URJ3oslhx12mA466CDffiUlJbr77rv18ssv+z4XprKysgD+sra19/PYljVr1uj3v/+9PvzwwxYXscwxbt26VZI0ZMgQv8ftdnur3eiff/55/elPf9LatWvV0NDg256Xl3fAv0fa/3lJTEzU9OnT9cwzz+jyyy/XLbfcohNPPFHnnHOOzj33XFmtXZ9DCfQ9b+vv7uz7tK+tW7fKarW2OE+ZmZlKTk72nUfTvu+z5H2vD/T5B4BwRpAOACGWlJSkrKwsrV69er/7rV69Wv369VNiYuJ+92tPBtfj8eikk07STTfd1OrjzYO0YDv99NMVGxurV155RePHj9crr7wiq9Wq8847z298FotF7777bqvdquPj4zt0bIvF4pfBN7XWYExSm52yW3uNUOnoGJ1Op8466yz961//0hNPPKGioiItW7ZMc+fO9dvv/PPP12effaYbb7xRhx12mOLj4+XxeHTKKad0OAO87/vdmc9jaWmpjjvuOCUmJuqee+7R4MGDFR0dra+//lo333xzh8b44osv6uKLL9ZZZ52lG2+8Uenp6bLZbJo3b542bdrUrtc40HmJiYnRJ598oo8++khvv/223nvvPS1atEgnnHCC/vOf/3R5l/ZA3/Pm1QqmYLxPbWlvJUpP+I4CQKAI0gEgDJx22ml6+umntXTpUr8yZ9Onn36q/Px8/frXv27x2IYNG/yyVhs3bpTH49nvWtWDBw9WZWWlJk+evN9xDR48WO+//75KSkr2m00PpLQ7Li5Op512ml599VU9/PDDWrRokSZOnKjs7Gy/4xqGoby8vKBeMEhJSWm1DHbf7Fx7mZ3qzU7obQnk/Rk4cKDWrVvXYrtZtj1w4MAARrh/06dP1/PPP6/Fixfrxx9/lGEYfqXue/fu1eLFi3X33Xfrjjvu8G3fsGFDu14/JSVFpaWlftvq6+tVUFDgt629n8fWfPzxx9qzZ49ef/11HXvssb7tW7Zs8dvPfN82btyoSZMm+ba7XC7l5+f7NTJ77bXXNGjQIL3++ut+5661aR+dYbVadeKJJ+rEE0/Uww8/rLlz5+q2227TRx99pMmTJwelKV9br9GZ99zU3vcp0M+/x+PRhg0bfNUjkrehYmlpaVA//wAQrpiTDgBh4MYbb1RMTIx+/etft1jaqqSkRFdddZViY2N9S3k19/jjj/vd//Of/yxJmjp1apvHO//887V8+XK9//77LR4rLS2Vy+WS5J2HahiG7r777hb7Nc9UxcXFtQjG9mf69OnauXOnnnnmGX377bd+gaEknXPOObLZbLr77rtbZMQMw2jX8l+tGTx4sNauXavdu3f7tn377be+jtqB6tu3r4499lg9++yz2rZtW4txmuLi4iSpXe/Rqaeeqi+//FLLly/3bauqqtJTTz2l3NxcjRgxokNjbc3kyZOVmpqqRYsWadGiRRo7dqzfBR8zS7nvOThQt3XT4MGDW8xtfuqpp1pk0tv7eWxNa2Osr6/XE0884bffEUccoT59+ujpp5/2e72///3vLUqjW3vNL774wu+cdFZJSUmLbWbXeHOpsUA+N21p67vZmffc1N73KTY21ve6B3LqqadKavkZe/jhhyV5VyYAgN6OTDoAhIGhQ4fq+eef14wZM3TooYfqsssuU15envLz8/XXv/5VxcXFeumll1pd2mzLli0644wzdMopp2j58uV68cUX9ctf/lKjR49u83g33nij/u///k+nnXaab7miqqoqfffdd3rttdeUn5+vtLQ0TZo0SRdeeKHmz5+vDRs2+EqcP/30U02aNElXX321JGnMmDH673//q4cffljZ2dnKy8trdV616dRTT1VCQoJuuOEG2Ww2/fznP/d7fPDgwfrDH/6gW2+91bdMVkJCgrZs2aJ//etfuvLKK3XDDTcE/D5feumlevjhhzVlyhRddtll2rVrlxYsWKCRI0e2mMvcXvPnz9eECRP0s5/9TFdeeaXvvL399ttatWqVJO/7I0m33XabfvGLXygqKkqnn366Lwhr7pZbbtFLL72kqVOn6pprrlFqaqqef/55bdmyRf/85z+DOl85KipK55xzjl5++WVVVVXpj3/8o9/jiYmJOvbYY/Xggw+qoaFB/fr103/+858WWeq2XH755brqqqv085//XCeddJK+/fZbvf/++75l6Ezt/Ty2Zvz48UpJSdHMmTN1zTXXyGKx6G9/+1uLCwsOh0N33XWXfvvb3+qEE07Q+eefr/z8fC1cuFCDBw/2y/aedtppev3113X22Wdr2rRp2rJlixYsWKARI0aosrKyXX/7gdxzzz365JNPNG3aNA0cOFC7du3SE088of79+/uqaQYPHqzk5GQtWLBACQkJiouL01FHHRXQfO8xY8boySef1B/+8AcNGTJE6enpOuGEEzr1npva+z7FxMRoxIgRWrRokQ466CClpqbqkEMOabWXw+jRozVz5kw99dRTvqkMX375pZ5//nmdddZZflUQANBrdXM3eQDAfqxevdq44IILjKysLCMqKsrIzMw0LrjgglaX0zKXLvrhhx+Mc88910hISDBSUlKMq6++2qipqfHbd98lrwzDu6zX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\n",
      "text/plain": [
       "<Figure size 1200x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create empty array for callback to store evaluations of the objective function (callback)\n",
    "objective_func_vals = []\n",
    "plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
    "\n",
    "# fit classifier to data\n",
    "estimator_classifier.fit(X, y)\n",
    "\n",
    "# return to default figsize\n",
    "plt.rcParams[\"figure.figsize\"] = (6, 4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The classifier can now differentiate between classes with an accuracy of:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# score classifier\n",
    "estimator_classifier.score(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3 Compute Local Effective Dimension of trained QNN\n",
    "\n",
    "Now that we have trained our network, let's evaluate the local effective dimension based on the trained weights. To do that we access the trained weights directly from the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for trained QNN:  [0.9305884  0.93484044 0.93681635 0.94770556 0.95038097 0.95344263\n",
      " 0.95564803 0.95710276 0.96120296 0.96384635]\n"
     ]
    }
   ],
   "source": [
    "trained_weights = estimator_classifier.weights\n",
    "\n",
    "# get Local Effective Dimension for set of trained weights\n",
    "local_ed_trained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=trained_weights, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_trained = local_ed_trained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for trained QNN: \",\n",
    "    local_eff_dim_trained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.4 Compute Local Effective Dimension of untrained QNN\n",
    "\n",
    "We can compare this result with the effective dimension of the untrained network, using the `initial_point` as our weight sample:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "normalized local effective dimensions for untrained QNN:  [0.91720724 0.92272259 0.92521449 0.93849766 0.94169028 0.94532435\n",
      " 0.9479323  0.94964908 0.95447705 0.9575838 ]\n"
     ]
    }
   ],
   "source": [
    "# get Local Effective Dimension for set of untrained weights\n",
    "local_ed_untrained = LocalEffectiveDimension(\n",
    "    qnn=estimator_qnn, weight_samples=initial_point, input_samples=X\n",
    ")\n",
    "\n",
    "local_eff_dim_untrained = local_ed_untrained.get_effective_dimension(dataset_size=n)\n",
    "\n",
    "print(\n",
    "    \"normalized local effective dimensions for untrained QNN: \",\n",
    "    local_eff_dim_untrained / estimator_qnn.num_weights,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 4.5 Plot and analyze results\n",
    "\n",
    "If we plot the effective dimension values before and after training, we can see the following result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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lX8lLF++HNeuXUPLli0xe/ZsAIqRjJIv38mTJ2PRokVo3Lgx7O3tkZiYiB49emDu3LkwMzPD999/j969eyMuLg5eXl7lvs+sWbPw5ZdfYuHChVi5ciUGDx6M27dvw8HBARkZGejatSveeecdLF26FPn5+fj0008xYMAAHDp0CAAwceJEHD16FL/88gucnZ3x2Wef4dy5cwgMDFT7fra2tggMDMSRI0cQHByMS5cuQSQS4fz588jJyYGVlRWOHj2KsLAwAIrvw/DwcHTo0AF///03TExM8MUXX6B79+64ePEixGJxmfeIiIjAiRMnsHfvXri4uGD69OlqY1q8eDHmzJmDzz77DD///DPef/99hIWFwc/PD6dPn0ZISAj++usvtGjRAmKxGMXFxejbty9GjRqFbdu2oaioCKdPn64VM6+0GgkxNTXFzp079RVL3ceaECKq5WxtbSEWi2FhYQFXV1e4urqq9ImYPXs2Xn75Zfj6+sLBwQFt2rTBu+++i5YtW6Jp06aYM2cOfH19y4xsPG348OEYNGgQmjRpgnnz5iEnJwenT58GAKxatQpBQUGYN28e/P39ERQUhPXr1+Pw4cO4du0acnJy8N1332HRokV46aWX0KpVK2zatAnFxcUVvmeXLl1w5MgRAIqRhZdffhkBAQE4fvy4cltJErJjxw7I5XKsW7cOrVq1QkBAADZs2IA7d+4oj1FadnY2Nm3apIypZcuW2LBhA2QyWZl9e/TogQ8++ABNmjTBp59+CkdHRxw+fBjAk0tXDRo0gKurKxwcHJCVlYXMzEz06tULvr6+CAgIwLBhwypM8moKrWtC+vbtiz179uDjjz/WRzx1G5MQIqqAuakxrswON9h760JwcLDK45ycHMycORO//fYb7t27h+LiYuTn5+POnTsVHqd169bK+5aWlrCxsVG2Cr9w4QIOHz4MKyurMq+Lj49Hfn4+ioqKEBoaqtzu4OAAPz+/Ct8zLCwM3333HWQyGY4ePYpXXnkFrq6uOHLkCFq3bo0bN24oL39cuHABN27cgLW1at+ngoICxMfHlzn2zZs3IZVKERISotxma2urNqbSn10kEsHV1VX52dVxcHDA8OHDER4ejpdffhndunXDgAEDnrmlenXQOglp2rQpZs+ejRMnTqBdu3awtFSdbjpu3DidBVfn8HIMEVVAJBJpdEmkJnv6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\n",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the normalized effective dimension for the model\n",
    "plt.plot(n, np.array(local_eff_dim_trained) / estimator_qnn.num_weights, label=\"trained weights\")\n",
    "plt.plot(\n",
    "    n, np.array(local_eff_dim_untrained) / estimator_qnn.num_weights, label=\"untrained weights\"\n",
    ")\n",
    "\n",
    "plt.xlabel(\"Number of data\")\n",
    "plt.ylabel(\"Normalized LOCAL effective dimension\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In general, we should expect the value of the local effective dimension to decrease after training. This can be understood by looking back into the main goal of machine learning, which is to pick a model that is expressive enough to fit your data, but not too expressive that it overfits and performs badly on new data samples.  \n",
    "\n",
    "Certain optimizers help regularize the overfitting of a model by learning parameters, and this action of learning inherently reduces a model’s expressiveness, as measured by the local effective dimension. Following this logic, a randomly initialized parameter set will most likely produce a higher effective dimension that the final set of trained weights, because that model with that particular parameterization is “using more parameters” unnecessarily to fit the data. After training (with the implicit regularization), a trained model will not need to use so many parameters and thus have more “inactive parameters” and a lower effective dimension. \n",
    "\n",
    "We must keep in mind though that this is the general intuition, and there might be cases where a randomly selected set of weights happens to provide a lower effective dimension than the trained weights for a specific model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>0.44.1</td></tr><tr><td><code>qiskit-terra</code></td><td>0.25.1</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.6.1</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.10.8</td></tr><tr><td>Python compiler</td><td>GCC 10.4.0</td></tr><tr><td>Python build</td><td>main, Nov 22 2022 08:26:04</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>8</td></tr><tr><td>Memory (Gb)</td><td>31.142810821533203</td></tr><tr><td colspan='2'>Wed Nov 22 16:42:07 2023 UTC</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2023.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import qiskit.tools.jupyter\n",
    "\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.8"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {
     "0c05b6d393dd4b49be53892e27830986": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonModel",
      "state": {
       "button_style": "primary",
       "description": "Clear",
       "layout": "IPY_MODEL_bb54fc7dbd994fa58136aeb2633dd0d8",
       "style": "IPY_MODEL_859a5c27797d4c6391a2ffc54bd1f45a",
       "tooltip": null
      }
     },
     "0fa3920404cb400aa1262aab81f6963e": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {}
     },
     "12fef230d7974beab832aa842ce44964": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_520a6f2d55564710b9adb4dfaa02b06f",
       "style": "IPY_MODEL_ad7af468774a493fb724a32c35032bb0",
       "value": "<h5>Status</h5>"
      }
     },
     "520a6f2d55564710b9adb4dfaa02b06f": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "95px"
      }
     },
     "57d5535b93e04e678cd4aa0b6db09a53": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_69772106db1f44388e2060f262fe007b",
       "style": "IPY_MODEL_65a076396c6e4202a2d81ad414a12aa1",
       "value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
      }
     },
     "5d73fe2fcd534a298bf09063e6002443": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "636e0d58be394f7da638955995e1babe": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_aa309dd5d683413b89173b46cc42b12a",
       "style": "IPY_MODEL_5d73fe2fcd534a298bf09063e6002443",
       "value": "<h5>Job ID</h5>"
      }
     },
     "65a076396c6e4202a2d81ad414a12aa1": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "69772106db1f44388e2060f262fe007b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 10px 0px"
      }
     },
     "8425a817c74342a3b4dee9fda5daa66a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "859a5c27797d4c6391a2ffc54bd1f45a": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "ButtonStyleModel",
      "state": {
       "font_family": null,
       "font_size": null,
       "font_style": null,
       "font_variant": null,
       "font_weight": null,
       "text_color": null,
       "text_decoration": null
      }
     },
     "9978517b2bc64f45acd55a8e997888ef": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "GridBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_0c05b6d393dd4b49be53892e27830986"
       ],
       "layout": "IPY_MODEL_c94148ca3d3748e1b102299b412c7818"
      }
     },
     "9b48e5bfdd454b6c98ec1b8e329f6beb": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "70px"
      }
     },
     "aa309dd5d683413b89173b46cc42b12a": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "190px"
      }
     },
     "ad7af468774a493fb724a32c35032bb0": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "b360776d7cb94aa19e237f8707a17f23": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_bb7ae96152be48719f0d15824319f28b",
       "style": "IPY_MODEL_bf24f1df4e474088a6a9c74c70cabaf5",
       "value": "<h5>Backend</h5>"
      }
     },
     "bb54fc7dbd994fa58136aeb2633dd0d8": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_area": "right",
       "padding": "0px 0px 0px 0px",
       "width": "70px"
      }
     },
     "bb7ae96152be48719f0d15824319f28b": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "width": "145px"
      }
     },
     "bf24f1df4e474088a6a9c74c70cabaf5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "bff352971c934dcca686028939e41356": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_9b48e5bfdd454b6c98ec1b8e329f6beb",
       "style": "IPY_MODEL_d2c98597c2ed4ad294faf8eaf694e1e5",
       "value": "<h5>Queue</h5>"
      }
     },
     "c94148ca3d3748e1b102299b412c7818": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "grid_template_areas": "\n                                       \". . . . right \"\n                                        ",
       "grid_template_columns": "20% 20% 20% 20% 20%",
       "width": "100%"
      }
     },
     "ce06bef166c541dd8d24f5f4253bb595": {
      "model_module": "@jupyter-widgets/base",
      "model_module_version": "2.0.0",
      "model_name": "LayoutModel",
      "state": {
       "margin": "0px 0px 0px 37px",
       "width": "600px"
      }
     },
     "d2c98597c2ed4ad294faf8eaf694e1e5": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLStyleModel",
      "state": {
       "description_width": "",
       "font_size": null,
       "text_color": null
      }
     },
     "d823fe0ca88c4f249c2bfd2304ef5b81": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HTMLModel",
      "state": {
       "layout": "IPY_MODEL_0fa3920404cb400aa1262aab81f6963e",
       "style": "IPY_MODEL_8425a817c74342a3b4dee9fda5daa66a",
       "value": "<h5>Message</h5>"
      }
     },
     "f4c4e4b987b14285b26672b6fb2ed026": {
      "model_module": "@jupyter-widgets/controls",
      "model_module_version": "2.0.0",
      "model_name": "HBoxModel",
      "state": {
       "children": [
        "IPY_MODEL_636e0d58be394f7da638955995e1babe",
        "IPY_MODEL_b360776d7cb94aa19e237f8707a17f23",
        "IPY_MODEL_12fef230d7974beab832aa842ce44964",
        "IPY_MODEL_bff352971c934dcca686028939e41356",
        "IPY_MODEL_d823fe0ca88c4f249c2bfd2304ef5b81"
       ],
       "layout": "IPY_MODEL_ce06bef166c541dd8d24f5f4253bb595"
      }
     }
    },
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}